/**代码收集 */
class Collect {
  constructor(startFlag, endFlag) {
    this.startFlag = startFlag // 开始标识
    this.endFlag = endFlag // 结束标识
    this.init()
  }
  /**初始化 */
  init() {
    this.code = ''
    this.start = false // 开始收集
    this.done = false // 收集完成
    this.allStr = '' // 运行期间所有经过的字符用于辅助判断
    // 没有开始标识 则默认直接收集知道遇到结束标识为止
    if (!this.startFlag) {
      this.start = true
    }
  }
  /**
   * 是否开始标识
   * @param {string} s
   * @returns
   */
  isStart(s) {
    if (this.startFlag.length == 1) {
      return s === this.startFlag
    } else {
      return this.allStr.includes(this.startFlag)
    }
  }
  /**
   * 是否结束标识
   * @param {string} s
   * @returns
   */
  isEnd(s) {
    if (this.endFlag.length == 1) {
      return s === this.endFlag
    } else {
      return this.allStr.endsWith(this.endFlag)
    }
  }
  /**
   * 收集字符
   * @param {string} s
   * @returns
   */
  push(s) {
    if (this.done) return
    this.allStr += s
    if (!this.start && this.isStart(s)) {
      this.start = true
      return
    }
    if (this.start) {
      if (this.isEnd(s)) {
        this.done = true
      } else {
        this.code += s
      }
    }
  }
}
/**代码块 */
class CodeBlock {
  constructor(left, right) {
    this.left = left // 左侧标识
    this.right = right // 右侧标识
    this.init()
  }
  /**初始化 */
  init() {
    this.code = ''
    this.stack = []
    this.start = false // 开始收集
    this.done = false // 收集完成
  }
  /**
   * 收集字符
   * @param {string} s
   * @returns
   */
  push(s) {
    if (this.done) return
    if (s === this.left) {
      this.start = true
      this.stack.push(s)
    } else if (s == this.right) {
      this.stack.pop()
    }
    if (this.start && this.stack.length == 0) {
      this.done = true
    }
    if (this.start) {
      this.code += s
    }
  }
}

module.exports = {
  Collect,
  CodeBlock
}
